import java.util.ArrayList;
import java.util.Arrays;

public class MyArrayList<E> {
    //字段
    private E[] arr;
    private static final int DEFAULT_CAPACITY = 5;
    private int underSize;


    //构造方法初始化
    public MyArrayList() {
        arr=(E[])new Object[DEFAULT_CAPACITY];
        this.underSize=0;
    }
    //显示所有元素
    public void display() {
        System.out.print("[");
        for (int i = 0; i < this.underSize; i++) {
            if(i!=this.underSize-1){
                System.out.print(arr[i]+",");
            }else {
                System.out.print(arr[i]);
            }
        }
        System.out.println("]");
    }
    public boolean isFull(){
        return this.underSize==this.arr.length;
    }
    // 新增元素,默认在数组最后新增
    public void add(E data) {
        try{
            if(isFull()){
                this.arr=Arrays.copyOf(arr,arr.length*2);
            }
        }catch (NegativeArraySizeException e){
            e.printStackTrace();
        }
        arr[this.underSize]=data;
        this.underSize++;
    }
    //检查某个位置是否合法
    private void checkAddPos(int pos) {
        if(pos<0||pos>this.underSize){
            throw new IndexOutOfBoundsException("Index:"+pos+", Size:"+this.underSize);
        }
    }
    // 在 pos 位置新增元素
    public void add(int pos, E data) {
        try {
            checkAddPos(pos);
            if (isFull()) {
                this.arr = Arrays.copyOf(arr, arr.length * 2);
            }
                for (int i = underSize - 1; i >= pos; i--) {
                    arr[i + 1] = arr[i];
                }
                arr[pos] = data;
                this.underSize++;

        } catch (NegativeArraySizeException |IndexOutOfBoundsException e) {
            e.printStackTrace();
        }

    }
    // 判定是否包含某个元素
    public boolean contains(E toFind) {
        for (int i = 0; i < this.underSize; i++) {
            if(arr[i].equals(toFind)){
                return true;
            }
        }
        return false;
    }
    // 查找某个元素对应的位置
    public int indexOf(E toFind) {
        for (int i = 0; i < this.underSize; i++) {
            if(arr[i].equals(toFind)){
                return i;
            }
        }
        return -1;
    }
    // 获取 pos 位置的元素
    public E get(int pos) {
        try{
            checkAddPos(pos);
            return arr[pos];
        }catch (IndexOutOfBoundsException e){
            e.printStackTrace();
        }
        return null;
    }
    // 给 pos 位置的元素设为 value
    public void set(int pos, E value) {
        try{
            checkAddPos(pos);
            arr[pos]=value;
        }catch (IndexOutOfBoundsException e){
            e.printStackTrace();
        }
    }
    //删除第一次出现的关键字key
    public void remove(E key) {
        int tmp=indexOf(key);
        if(tmp!=-1){//找到关键字key
            for (int i = tmp; i <this.underSize ; i++) {
                arr[i]=arr[i+1];
            }
            this.underSize--;
        }
    }
    // 获取顺序表长度
    public int size() {
        return this.underSize;
    }
    // 清空顺序表
    public void clear() {
        this.underSize=0;
    }
}
